home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / Arashi 1.1 / Game Source / jam src / Shapes.c < prev    next >
Text File  |  1992-09-09  |  5KB  |  275 lines

  1. /*/
  2.      Project Arashi: Shapes.c
  3.      Major release: Version 1.1, 7/22/92
  4.  
  5.      Last modification: Wednesday, September 9, 1992, 21:44
  6.      Created: Monday, July 24, 1989, 22:47
  7.  
  8.      Copyright © 1989-1992, Juri Munkki
  9. /*/
  10.  
  11. #include "VA.h"
  12. #include "STORM.h"
  13. #include "STCrack.h"
  14. #include <FixMath.h>
  15.  
  16. #define    FUSESEGMENTS    3
  17.  
  18. static    int        fusedivs[]={1500,800,600};
  19. static    int        fuseoff[5][FUSESEGMENTS];
  20. static    Point    BlowCenter;
  21. static    int        RotSpeed;
  22. static    int        BlowSize;
  23.  
  24. #define    FIXEDPI    (205887L)    /*    pi*65536    */
  25.  
  26. void    BlowUpLine(x,y)
  27. int        x,y;
  28. {
  29.     long    unitsize;
  30.     Point    delta;
  31.     Rect    square;
  32.     int        angle;
  33.         
  34.     delta.h = x-VA.CurrentX;
  35.     delta.v = y-VA.CurrentY;
  36.     
  37.     unitsize = FracSqrt(delta.h*(long)delta.h+delta.v*(long)delta.v)>>15;
  38.     
  39.     angle = FixATan2(delta.h,-delta.v) * ANGLES / (2*FIXEDPI);
  40.     angle = (ANGLES+angle) % ANGLES;
  41.  
  42.     delta.h = x-BlowCenter.h-(delta.h>>1);
  43.     delta.v = y-BlowCenter.v-(delta.v>>1);
  44.     
  45.     
  46.     AddCrack((VA.CurrentX+x)>>1,(VA.CurrentY+y)>>1,
  47.                 delta.h,delta.v,VA.color,
  48.                 unitsize,FlyingVector,angle,RotSpeed,BlowSize);
  49.     
  50.     RotSpeed= -RotSpeed;
  51.     VAMoveTo(x,y);
  52. }
  53. void    BlowUpHalfLine(x,y)
  54. int        x,y;
  55. {
  56.     BlowUpLine((x+VA.CurrentX)>>1,(y+VA.CurrentY)>>1);
  57.     BlowUpLine(x,y);
  58. }
  59.  
  60. void    UpdateFuseOff()
  61. {
  62.     register    int        i,j;
  63.     
  64.     for(j=FUSESEGMENTS-1;j>0;j--)
  65.     for(i=0;i<5;i++)
  66.     {    fuseoff[i][j]=fuseoff[i][j-1];
  67.     }        
  68.     for(i=0;i<5;i++)
  69.     {    fuseoff[i][0]=(FastRandom() & 15) - 7;
  70.     }
  71. }
  72.  
  73.  
  74. void    DrawFuseBall(cx,cy,size,angle)
  75. register    int        cx,cy,size,angle;
  76. {
  77.     int        dx,dy,i,j,a;
  78.     
  79.     for(i=0;i<5;i++)
  80.     {    VA.color=ThisLevel.fuColor[i];
  81.         VAMoveTo(cx,cy);
  82.  
  83.         for(j=0;j<FUSESEGMENTS;j++)
  84.         {
  85.             a=angle+fuseoff[i][j];
  86.             if(a<0) a+=ANGLES;
  87.             if(a>=ANGLES)    a-=ANGLES;
  88.  
  89.             dx=((long)size * Cosins[a])/fusedivs[j];
  90.             dy=((long)size * Sins[a]  )/fusedivs[j];
  91.             VALineTo(cx+dx,cy+dy);
  92.         }
  93.  
  94.         angle+=(ANGLES/5);
  95.         if(angle>=ANGLES)    angle-=ANGLES;
  96.     }
  97. }
  98. void    BlowFuseBall(cx,cy,size,angle)
  99. register    int        cx,cy,size,angle;
  100. {
  101.     int        dx,dy,i,j,a;
  102.     
  103.     RotSpeed=4;
  104.     BlowSize=10;
  105.     BlowCenter.h=cx;
  106.     BlowCenter.v=cy;
  107.  
  108.     for(i=0;i<5;i++)
  109.     {    VA.color=ThisLevel.fuColor[i];
  110.         VAMoveTo(cx,cy);
  111.  
  112.         for(j=0;j<FUSESEGMENTS;j++)
  113.         {
  114.             a=angle+fuseoff[i][j];
  115.             if(a<0) a+=ANGLES;
  116.             if(a>=ANGLES)    a-=ANGLES;
  117.  
  118.             dx=((long)size * Cosins[a])/fusedivs[j];
  119.             dy=((long)size * Sins[a]  )/fusedivs[j];
  120.             BlowUpLine(cx+dx,cy+dy);
  121.         }
  122.  
  123.         angle+=(ANGLES/5);
  124.         if(angle>=ANGLES)    angle-=ANGLES;
  125.     }
  126. }
  127. void    DrawPlayer(cx,cy,dx,dy,slant)
  128. int        cx,cy,dx,dy,slant;
  129. {
  130.     register    int        x2,y2,dxs,dys;
  131.                 int        x1,y1,x4,y4,x8,y8;
  132.  
  133.     if(slant<1)slant=1;
  134.     if(slant>7)slant=7;
  135.     
  136.     x1=cx+dx;                    y1=cy+dy;
  137.     x4=dx>>2;                    y4=dy>>2;
  138.     x8=dx>>3;                    y8=dy>>3;
  139.     dxs=dx*slant;                dys=dy*slant;
  140.     
  141.     VAMoveTo(cx,cy);
  142.     x2=(dxs>>3)+y4;                y2=(dys>>3)-x4;
  143.  
  144.     VASafeLineTo(cx+x2,cy+y2);
  145.     VASafeLineTo(x1,y1);
  146.  
  147.     x2=-(dxs>>4)-y4;            y2=-(dys>>4)+x4;
  148.  
  149.     VASafeLineTo(x1+x2,y1+y2);
  150.     VASafeLineTo(x1-x8,y1-y8);
  151.  
  152.     x2=(dxs>>3)+y8;                y2=(dys>>3)-x8;
  153.  
  154.     VASafeLineTo(cx+x2,cy+y2);
  155.     VASafeLineTo(cx+x8,cy+y8);
  156.  
  157.     x2=(((8-slant)*dx)>>4)-y4;    y2=(((8-slant)*dy)>>4)+x4;
  158.  
  159.     VASafeLineTo(cx+x2,cy+y2);
  160.     VASafeLineTo(cx,cy);
  161. }
  162.  
  163. void    BlowUpPlayer(cx,cy,dx,dy,slant)
  164. int        cx,cy,dx,dy,slant;
  165. {
  166.     register    int        x2,y2,dxs,dys;
  167.                 int        x1,y1,x4,y4,x8,y8;
  168.  
  169.     if(slant<1)slant=1;
  170.     if(slant>7)slant=7;
  171.     
  172.     x1=cx+dx;                    y1=cy+dy;
  173.     x4=dx>>2;                    y4=dy>>2;
  174.     x8=dx>>3;                    y8=dy>>3;
  175.     dxs=dx*slant;                dys=dy*slant;
  176.  
  177.     BlowCenter.h = ((cx+x1)>>1);
  178.     BlowCenter.v = ((cy+y1)>>1);
  179.     RotSpeed=1;
  180.     BlowSize=40;
  181.     
  182.     VAMoveTo(cx,cy);
  183.     x2=(dxs>>3)+y4;                y2=(dys>>3)-x4;
  184.  
  185.     BlowUpHalfLine(cx+x2,cy+y2);
  186.     BlowUpHalfLine(x1,y1);
  187.  
  188.     x2=-(dxs>>4)-y4;            y2=-(dys>>4)+x4;
  189.  
  190.     BlowUpHalfLine(x1+x2,y1+y2);
  191.     BlowUpHalfLine(x1-x8,y1-y8);
  192.  
  193.     x2=(dxs>>3)+y8;                y2=(dys>>3)-x8;
  194.  
  195.     BlowUpHalfLine(cx+x2,cy+y2);
  196.     BlowUpHalfLine(cx+x8,cy+y8);
  197.  
  198.     x2=(((8-slant)*dx)>>4)-y4;    y2=(((8-slant)*dy)>>4)+x4;
  199.  
  200.     BlowUpHalfLine(cx+x2,cy+y2);
  201.     BlowUpHalfLine(cx,cy);
  202. }
  203.  
  204. void    DrawStaticPlayer(cx,cy,dx,dy)
  205. int        cx,cy,dx,dy;
  206. {
  207.     register    int        x2,y2,dxs,dys;
  208.                 int        x1,y1,x4,y4,x8,y8;
  209.     
  210.     x1=cx+dx;                    y1=cy+dy;
  211.     x4=dx>>2;                    y4=dy>>2;
  212.     x8=dx>>3;                    y8=dy>>3;
  213.     dxs=dx*4;                    dys=dy*4;
  214.     
  215.     VAMoveTo(cx,cy);
  216.     x2=(dx>>1)+y4;                y2=(dy>>1)-x4;
  217.  
  218.     VAStaticLineTo(cx+x2,cy+y2);
  219.     VAStaticLineTo(x1,y1);
  220.  
  221.     x2=-(dx>>2)-y4;                y2=-(dy>>2)+x4;
  222.  
  223.     VAStaticLineTo(x1+x2,y1+y2);
  224.     VAStaticLineTo(x1-x8,y1-y8);
  225.  
  226.     x2=(dx>>1)+y8;                y2=(dy>>1)-x8;
  227.  
  228.     VAStaticLineTo(cx+x2,cy+y2);
  229.     VAStaticLineTo(cx+x8,cy+y8);
  230.  
  231.     x2=(dx>>2)-y4;                y2=((dy)>>2)+x4;
  232.  
  233.     VAStaticLineTo(cx+x2,cy+y2);
  234.     VAStaticLineTo(cx,cy);
  235. }
  236.  
  237. #ifdef    FUZZYPLAYER
  238. void    VAFractalLineTo(int,int,int,int);
  239.  
  240. #define    FRACTALFACTOR    (1<<6)
  241. #define    FRACTALDIV        3
  242.  
  243. void    DrawFuzzyPlayer(cx,cy,dx,dy)
  244. int        cx,cy,dx,dy;
  245. {
  246.     register    int        x2,y2,dxs,dys;
  247.                 int        x1,y1,x4,y4,x8,y8;
  248.     
  249.     x1=cx+dx;                    y1=cy+dy;
  250.     x4=dx>>2;                    y4=dy>>2;
  251.     x8=dx>>3;                    y8=dy>>3;
  252.     dxs=dx*4;                    dys=dy*4;
  253.     
  254.     VAMoveTo(cx,cy);
  255.     x2=(dx>>1)+y4;                y2=(dy>>1)-x4;
  256.  
  257.     VAFractalLineTo(cx+x2,cy+y2,FRACTALFACTOR,FRACTALDIV);
  258.     VAFractalLineTo(x1,y1,FRACTALFACTOR,FRACTALDIV);
  259.  
  260.     x2=-(dx>>2)-y4;                y2=-(dy>>2)+x4;
  261.  
  262.     VAFractalLineTo(x1+x2,y1+y2,FRACTALFACTOR,FRACTALDIV);
  263.     VAFractalLineTo(x1-x8,y1-y8,FRACTALFACTOR,FRACTALDIV);
  264.  
  265.     x2=(dx>>1)+y8;                y2=(dy>>1)-x8;
  266.  
  267.     VAFractalLineTo(cx+x2,cy+y2,FRACTALFACTOR,FRACTALDIV);
  268.     VAFractalLineTo(cx+x8,cy+y8,FRACTALFACTOR,FRACTALDIV);
  269.  
  270.     x2=(dx>>2)-y4;                y2=((dy)>>2)+x4;
  271.  
  272.     VAFractalLineTo(cx+x2,cy+y2,FRACTALFACTOR,FRACTALDIV);
  273.     VAFractalLineTo(cx,cy,FRACTALFACTOR,FRACTALDIV);
  274. }
  275. #endif